/**
 *  74HC595 移位寄存器的使用 
 *  减少开发板中数字 I/O口的使用来控制8个LED 
**/

#define ON HIGH
#define OFF LOW
int ledState = 0;

int clockPin = 5;   // 接 595 的脚 11  （数据输入时钟线） 时钟脚   //74HC595 的 SH_CP
int latchPin = 4;   // 接 595 的脚 12  （输出存储器锁存时钟线）  // /74HC595 的 ST_CP
int dataPin = 2;   // 接 595 的脚 14  (DS)
int led[3] = {0b11110010,0b11110100,0b11111000}; //绿（1引脚 QB Q1） 黄（2引脚 QC Q2） 红（3引脚 QD Q3） [0b 代表二进制位] 


void updataLED(int value)
{
  digitalWrite(latchPin,LOW); //4引脚
  //shiftOut 将一个数据的一个字节一位一位的移出 ， 依次向数据脚写入每一位，之后时钟脚被拉高或拉低，指示刚才的数据有效;
  shiftOut(dataPin,clockPin,MSBFIRST,value);  //注释：使用 74HC595 移位寄存器从 0 到 255 计数 0xff  (注意第三个参数是 -> MSB 从最高有效位（最左边）或最低有效位（最右边）开始 LSB 。)
  //之后将 latchPin 拉高以告诉芯片,它不需要再接受信息了
  digitalWrite(latchPin,HIGH);  
}

void setup() {
 pinMode(latchPin,OUTPUT);
 pinMode(clockPin,OUTPUT);
 pinMode(dataPin,OUTPUT);
}

void loop() {
 //向上计数
 for(int i = 0; i < 3; i++)  
 {
  //传输数据的时候将 latchPin 
   updataLED(led[i]);
   delay(500);  
 }
}
